#!/usr/bin/env python
# -*- coding: utf-8 -*-

"""
数据库配置初始化脚本
从静态配置文件导入配置到数据库
"""

import logging
import sys
import os
from sqlalchemy.orm import Session
from sqlalchemy.exc import SQLAlchemyError, IntegrityError

# 添加项目根目录到Python路径
sys.path.append(os.path.dirname(os.path.abspath(__file__)))

# 导入配置文件和数据库模型
from backend.config.config import (
    DEFAULT_BRANDS, 
    DEFAULT_UNITS,
    DEFAULT_MARKETING_WORDS,
    DEFAULT_SYSTEM_CONFIG,
    DEFAULT_UNIT_CONVERSIONS
)
from backend.data_clean.models import (
    BrandConfig,
    UnitConfig,
    MarketingWordConfig,
    SystemConfig,
    UnitConversion
)
from backend.database import engine, get_db, Base

# 配置日志
logging.basicConfig(
    level=logging.INFO,
    format='%(asctime)s - %(name)s - %(levelname)s - %(message)s',
    handlers=[
        logging.StreamHandler(),
        logging.FileHandler('init_db_config.log')
    ]
)
logger = logging.getLogger(__name__)

def init_brands(db: Session):
    """初始化品牌配置"""
    logger.info("开始初始化品牌配置...")
    try:
        # 检查是否已有数据
        existing_count = db.query(BrandConfig).count()
        if existing_count > 0:
            logger.info(f"品牌配置已存在 {existing_count} 条记录，跳过初始化")
            return
        
        # 批量插入品牌配置
        brand_configs = [BrandConfig(**brand) for brand in DEFAULT_BRANDS]
        db.bulk_save_objects(brand_configs)
        db.commit()
        logger.info(f"成功初始化 {len(DEFAULT_BRANDS)} 条品牌配置")
    except IntegrityError as e:
        db.rollback()
        logger.error(f"品牌配置初始化失败（完整性错误）: {str(e)}")
    except SQLAlchemyError as e:
        db.rollback()
        logger.error(f"品牌配置初始化失败（数据库错误）: {str(e)}")
    except Exception as e:
        db.rollback()
        logger.error(f"品牌配置初始化失败（未知错误）: {str(e)}")

def init_units(db: Session):
    """初始化单位配置"""
    logger.info("开始初始化单位配置...")
    try:
        # 检查是否已有数据
        existing_count = db.query(UnitConfig).count()
        if existing_count > 0:
            logger.info(f"单位配置已存在 {existing_count} 条记录，跳过初始化")
            return
        
        # 批量插入单位配置
        unit_configs = [UnitConfig(**unit) for unit in DEFAULT_UNITS]
        db.bulk_save_objects(unit_configs)
        db.commit()
        logger.info(f"成功初始化 {len(DEFAULT_UNITS)} 条单位配置")
    except IntegrityError as e:
        db.rollback()
        logger.error(f"单位配置初始化失败（完整性错误）: {str(e)}")
    except SQLAlchemyError as e:
        db.rollback()
        logger.error(f"单位配置初始化失败（数据库错误）: {str(e)}")
    except Exception as e:
        db.rollback()
        logger.error(f"单位配置初始化失败（未知错误）: {str(e)}")

def init_marketing_words(db: Session):
    """初始化营销词配置"""
    logger.info("开始初始化营销词配置...")
    try:
        # 检查是否已有数据
        existing_count = db.query(MarketingWordConfig).count()
        if existing_count > 0:
            logger.info(f"营销词配置已存在 {existing_count} 条记录，跳过初始化")
            return
        
        # 批量插入营销词配置
        marketing_word_configs = [MarketingWordConfig(**word) for word in DEFAULT_MARKETING_WORDS]
        db.bulk_save_objects(marketing_word_configs)
        db.commit()
        logger.info(f"成功初始化 {len(DEFAULT_MARKETING_WORDS)} 条营销词配置")
    except IntegrityError as e:
        db.rollback()
        logger.error(f"营销词配置初始化失败（完整性错误）: {str(e)}")
    except SQLAlchemyError as e:
        db.rollback()
        logger.error(f"营销词配置初始化失败（数据库错误）: {str(e)}")
    except Exception as e:
        db.rollback()
        logger.error(f"营销词配置初始化失败（未知错误）: {str(e)}")

def init_system_config(db: Session):
    """初始化系统配置"""
    logger.info("开始初始化系统配置...")
    try:
        # 检查是否已有数据
        existing_count = db.query(SystemConfig).count()
        if existing_count > 0:
            logger.info(f"系统配置已存在 {existing_count} 条记录，跳过初始化")
            return
        
        # 批量插入系统配置
        system_configs = [SystemConfig(**config) for config in DEFAULT_SYSTEM_CONFIG]
        db.bulk_save_objects(system_configs)
        db.commit()
        logger.info(f"成功初始化 {len(DEFAULT_SYSTEM_CONFIG)} 条系统配置")
    except IntegrityError as e:
        db.rollback()
        logger.error(f"系统配置初始化失败（完整性错误）: {str(e)}")
    except SQLAlchemyError as e:
        db.rollback()
        logger.error(f"系统配置初始化失败（数据库错误）: {str(e)}")
    except Exception as e:
        db.rollback()
        logger.error(f"系统配置初始化失败（未知错误）: {str(e)}")

def init_unit_conversions(db: Session):
    """初始化单位转换规则"""
    logger.info("开始初始化单位转换规则...")
    try:
        # 检查是否已有数据
        existing_count = db.query(UnitConversion).count()
        if existing_count > 0:
            logger.info(f"单位转换规则已存在 {existing_count} 条记录，跳过初始化")
            return
        
        # 获取所有单位配置
        unit_configs = {unit.name: unit.id for unit in db.query(UnitConfig).all()}
        
        # 准备单位转换规则数据
        unit_conversions = []
        for conversion in DEFAULT_UNIT_CONVERSIONS:
            # 获取源单位ID和目标单位ID
            source_unit_id = unit_configs.get(conversion['source_unit'])
            target_unit_id = unit_configs.get(conversion['target_unit'])
            
            if not source_unit_id or not target_unit_id:
                logger.warning(f"单位转换规则初始化：找不到单位 {conversion['source_unit']} 或 {conversion['target_unit']}，跳过该规则")
                continue
            
            # 创建转换规则对象
            unit_conversion = UnitConversion(
                source_unit_id=source_unit_id,
                target_unit_id=target_unit_id,
                conversion_factor=conversion['conversion_factor'],
                is_active=conversion.get('is_active', True)
            )
            unit_conversions.append(unit_conversion)
        
        # 批量插入单位转换规则
        db.bulk_save_objects(unit_conversions)
        db.commit()
        logger.info(f"成功初始化 {len(unit_conversions)} 条单位转换规则")
    except IntegrityError as e:
        db.rollback()
        logger.error(f"单位转换规则初始化失败（完整性错误）: {str(e)}")
    except SQLAlchemyError as e:
        db.rollback()
        logger.error(f"单位转换规则初始化失败（数据库错误）: {str(e)}")
    except Exception as e:
        db.rollback()
        logger.error(f"单位转换规则初始化失败（未知错误）: {str(e)}")

def init_db():
    """主函数：初始化所有数据库配置"""
    logger.info("开始执行数据库配置初始化...")
    
    # 创建所有表（如果不存在）
    Base.metadata.create_all(bind=engine)
    logger.info("数据库表创建或已存在")
    
    # 获取数据库会话
    db = next(get_db())
    try:
        # 按顺序初始化各配置
        init_brands(db)
        init_units(db)
        init_marketing_words(db)
        init_system_config(db)
        # 单位转换规则需要依赖单位配置，所以最后初始化
        init_unit_conversions(db)
        
        logger.info("数据库配置初始化完成")
    except Exception as e:
        logger.error(f"数据库配置初始化过程中发生错误: {str(e)}")
    finally:
        db.close()

if __name__ == "__main__":
    init_db() 